package cti

import (
	"encoding/json"
	"errors"
	log "github.com/sirupsen/logrus"
	"oa-rest/common"
)

/*
{
    "keywords": {
        "low_level_keywords": [
            "参保人数",
            "缴费基数",
            "待遇标准",
            "养老金",
            "医疗保险"
        ]
    },
    "references": [
        {
            "content": "将移交司法机关处理并保留向责任人追偿权利。\n十五、制度的修订与解释\n本制度由人力资源部牵头起草，财务、法务部门会签，董事会批准后实施；\n本制度应至少每年审阅一次，或在国家/地方政策调整、公司组织结构重大变化时及时修订；\n本制度的最终解释权归公司法务部所有。\n附件（示例表格与流程）\n附件A：入职社保登记清单（模拟数据示例）\n员工姓名：张三\n身份证号：110101199001010011\n入职日期：2024-08-01\n岗位与部门：研发部 - 高级工程师1. \n2. \n1. \n2. \n3. \n4. \n1. \n2. \n3. \n1. \n2. \n1. \n2. \n3. \n• \n• \n• \n• \n4\n参保地/社保账号：北京市社保 - 110101199001010011\n缴费基数（本地年度基数）：¥20,000\n代扣比例（个人）：8%（示例合计）\n单位缴纳比例（单位）：30%（示例合计）\n备注：无\n员工姓名：李四\n身份证号：110101199205150022\n入职日期：2023-03-15\n岗位与部门：产品部 - 经理\n参保地/社保账号：北京市社保 - 110101199205150022\n缴费基数：¥15,000\n个人：8%\n单位：30%\n备注：无\n员工姓名：王五\n身份证号：110101199510200033\n入职日期：2022-11-01\n岗位与部门：运维部 - 工程师\n缴费基数：¥8,500\n个人：8%\n单位：30%\n备注：试用期已转正\n员工姓名：赵六\n身份证号：110101198811300044\n入职日期：2019-06-01\n岗位与部门：销售部 - 主管\n缴费基数：¥25,000\n个人：8%\n单位：30%\n备注：含外派补贴（不计入社保基数）\n员工姓名：陈七\n身份证号：110101199301070055\n入职日期：2024-02-20\n岗位与部门：行政部 - 专员\n缴费基数：¥12,000\n个人：8%\n单位：30%\n备注：当月银行回单延迟• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n• \n5\n附件B：月度缴费对账表（模拟数据 — 以2025年8月为例）\n序\n号员工\n姓名社保基数\n(¥)个人应缴\n(¥)单位应缴\n(¥)总应缴\n(¥)银行流水（凭证\n号）是否已到账\n1 张三 20,000 1,600 6,000 7,600 20250801001 是\n2 李四 15,000 1,200 4,500 5,700 20250801002 是\n3 王五 8,500 680 2,550 3,230 20250801003 是\n4 赵六 25,000 2,000 7,500 9,500 20250801004 是\n5 陈七 12,000 960 3,600 4,560 20250801005否（银行回单\n延迟）\n小计 ：个人合计 = ¥6,440；单位合计 = ¥24,150；总合计 = ¥30,590。\n附件C：常见计算公式（示例与带数计算）\n个人月缴额 = 缴费基数 × 个人缴费比例（示例按8%计算）\n张三个人月缴额 = 20,000 × 8% = ¥1,600\n李四个人月缴额 = 15,000 × 8% = ¥1,200\n单位月缴额 = 缴费基数 × 单位缴费比例（示例按30%计算）\n张三单位月缴额 = 20,000 × 30% = ¥6,000\n李四单位月缴额 = 15,000 × 30% = ¥4,500\n总缴费 = 个人月缴额 + 单位月缴额\n张三总缴费 = ¥1,600 + ¥6,000 = ¥7,600\n滞纳金（按当地政策示例公式）：滞纳金 = 欠缴金额 × 滞纳利率 × 欠缴月数（示例不含具体利率）\n（注：以上比例为示例比例，仅用于模拟数据演示。实际基数与比例以当地社保公积金中心公布为准。）\n附件D：典型操作流程（简要）\n入职  → HR收集资料 → 在社保系统建档 → 生效参保；\n变更（如薪资变动/岗位调整）  → HR在次月前申报变更并通知财务；\n停缴/离职  → HR",
            "file_path": "企业社保管理制度.pdf"
        },
        {
            "content": "：以上比例为示例比例，仅用于模拟数据演示。实际基数与比例以当地社保公积金中心公布为准。）\n附件D：典型操作流程（简要）\n入职  → HR收集资料 → 在社保系统建档 → 生效参保；\n变更（如薪资变动/岗位调整）  → HR在次月前申报变更并通知财务；\n停缴/离职  → HR提交停保申请并出具离职证明 → 完成参保关系转出或中断手续；\n附件E：月度缴费汇总与银行付款指令（模拟示例）\n缴费月份：2025年08月\n应缴总额（表内总计）：¥30,590\n计划付款日：2025-08-05\n银行付款指令（示例）：\n收款方：北京市社会保险基金管理中心\n账号：1101-0000-2025-0805\n摘要：2025年8月社保及公积金缴费（公司名称）\n备注：陈七银行回单延迟，财务需与银行跟进并补充回单；如出现未到账项，应在3个工作日内完成追\n踪并在次月一并补缴或说明原因。• \n• \n• \n• \n• \n• \n• \n• \n• \n1. \n2. \n3. \n• \n• \n• \n• \n• \n• \n• \n• \n6\n结语\n本制度旨在为公司与员工之间建立明确、透明且合规的社保与公积金管理机制，既保护员工权益，又保障公司\n运营合规性。HR、财务及各部门应密切协作，确保制度落地执行。如需将本制度转换为公司正式文件（盖章\n版）或根据指定地方法规做本地化修改，我可继续为你定制并生成最终盖章文本或Word/PDF版。\n7",
            "file_path": "企业社保管理制度.pdf"
        }
    ]
}

*/

type SearchResponse struct {
	Keywords  map[string][]string       `json:"keywords"`
	Reference []searchResponseReference `json:"references"`
}

type searchResponseReference struct {
	Content  string `json:"content"`
	FilePath string `json:"file_path"`
}

/*
{
    "success": true,
    "message": "情绪分析完成",
    "emotion": "angry",
    "confidence": 0.85,
    "response": "您好，感谢您的反馈！我们非常重视您的心情，已为您登记并优先处理。我们将尽快核实情况，提供具体解决方案，确保问题得到妥善解决。请您耐心等待，政府服务始终为您保驾护航！"
}
*/

type EmoResponse struct {
	AnalyzeResponse map[string]any `json:"analyze_response"`
}

type SummarizeResponse struct {
	Content string `json:"content"`
}

// FetchDataByFileUrl 通用的AI模型调用接口，只需要传递s3文件url，以及要调用的接口路由（可能带着ip+端口），就返回通用的json response
func FetchDataByFileUrl[T any](endpoint, s3url string) (string, error) {
	reqParam := map[string]interface{}{"url": s3url, "mode": "hybrid"}
	var resParam T
	err := common.AIHttpClient.PostJSON(endpoint, reqParam, &resParam)
	if err != nil {
		log.Errorf("POST JSON error: %v", err)
		return "", err
	}

	msg := &wsMessage{
		Data: make(map[string]any),
	}

	// 使用类型开关来判断泛型参数T的具体类型
	switch v := any(resParam).(type) {
	case SearchResponse:
		msg.Type = "keyword"
		msg.Data["keywords"] = v.Keywords["low_level_keywords"]
		msg.Data["references"] = v.Reference
	case EmoResponse:
		msg.Type = "emotion"
		msg.Data["emotion"] = v.AnalyzeResponse["emotion"]
		msg.Data["confidence"] = v.AnalyzeResponse["confidence"]
		msg.Data["response"] = v.AnalyzeResponse["response"]
	case SummarizeResponse:
		return v.Content, nil
	default:
		// 如果是其他类型，返回一个默认的哈希字符串
		return "", errors.New("unknown type")
	}

	jsonData, err := json.Marshal(msg)
	if err != nil {
		log.Errorf("JSON marshal error: %v", err)
		return "", err
	}
	log.Infof("AI POST JSON result: %s", jsonData)

	return string(jsonData), nil
}
